package cn.demoncat.util.redis.annotation;

import cn.demoncat.util.redis.entity.RedisLock;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

/**
 * 分布式锁
 *
 * @see RedisLock   锁的参数
 *
 * @author 延晓磊
 * @since 2021年02月13日
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lock {

    /**
     * 缓存键/键前缀
     */
    @AliasFor("key")
    String value() default "";

    /**
     * 缓存键/键前缀
     */
    @AliasFor("value")
    String key() default "";

    /**
     * 缓存键的拼接参数
     *
     * 缓存键 = 键前缀 + 方法参数[keyArg[0]] + : + 方法参数[keyArg[1]]
     */
    int[] keyArg() default {};

    /**
     * 锁的自动过期秒数：0 不过期，执行完成后主动释放（顺序执行）；非0 到期自动释放，执行完成后不主动释放（间隔执行）
     *
     * 场景：lock,tryLock
     */
    int exp() default 0;

    /**
     * 尝试获取锁的秒数：0表示只尝试1次
     *
     * 场景：tryLock
     */
    int tryTime() default 0;

    /**
     * 事务：是否在事务提交后执行非阻塞无返回的锁操作，如解锁、释放资源
     */
    boolean tx() default false;

    /**
     * 粒度：Token，用户，全局（默认），将拼接为锁的KEY
     */
    String level() default RedisLock.Level.ALL;

    /**
     * 类型：尝试加锁（根据tryTime设置进行尝试，失败时放弃执行）、阻塞加锁（默认）
     */
    boolean tryLock() default false;
}
